package com.waimai.app.qa.support;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * JdbcExecutor,封装jdbc操作数据库关键字方法 
 * @author AiHui
 */
public class JdbcExecutor {
	public static final String DBDRIVER="com.mysql.jdbc.Driver";//数据库加载驱动程序
	public static Properties CONFIG = null;//CONFIG。Properties文件
	private String DBURL="";//数据库URL地址
	private String DBUSER="";//数据库用户名
	private String DBPASS="";//数据库密码
	private static String filename="";//sql文件的位置
	protected static Logger logger = Logger.getLogger(JdbcExecutor.class);//设置log信息
	
	/**
	 * 加载初始化配置文件
	 * @author liulian
	*/
	public void initmessageconfig() throws Exception{
		
		//读取log4j.properties文件路径
		PropertyConfigurator.configure("resources/configs/log4j.properties");
		try {	
			//使用Properties类加载属性文件
			CONFIG = new Properties();
			//读取CONFIG.properties文件路径
			FileInputStream fn = new FileInputStream(System.getProperty("user.dir")+"//resources//configs//CONFIG.properties");
			CONFIG.load(fn);
			fn.close();
			if(CONFIG.containsKey("url")){  
                DBURL = CONFIG.getProperty("url");  
            }  
            if(CONFIG.containsKey("user")){  
                DBUSER = CONFIG.getProperty("user");  
            }  
            if(CONFIG.containsKey("password")){  
                DBPASS = CONFIG.getProperty("password");  
            }  
            if(CONFIG.containsKey("filename")){
            	filename=CONFIG.getProperty("filename");
            }
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	/**
	 * 加载sql文件
	 * @author liulian
	*/
	 public static String readFileByChars(String fileName) throws IOException {
		    int charread = 0;
	        Reader reader = null;
	        char[] tempchars = new char[30000];
	        char[] tempchars1 = null;
	        String put1 = null;
	        try {
	            String encoding="utf-8"; 
	            //读入文件流
	            reader = new InputStreamReader(new FileInputStream(fileName),encoding);
	            //根据字符串读入文件到tempchars中
	            while ((charread = reader.read(tempchars)) != -1) {
	            	//去除文件中多余的空格
	            	tempchars1=Arrays.copyOf(tempchars, charread);
	            	//char类型转string类型
	            	 put1=String.valueOf(tempchars1);
	                }
	           // }

	        } catch (Exception e1) {
	            e1.printStackTrace();
	        } finally {
	            if (reader != null) {
	                try {
	                    reader.close();
	                } catch (IOException e1) {
	                }
	            }
	        }
			return put1;
	    }
	
	/**
	 * Odbc中execute方法，可以执行任何SQL语句
	 * @author liulian
	*/
	public boolean executeSql(String sql) throws Exception{
		java.sql.Connection conn=null;
		try{
			//加载驱动
			Class.forName(DBDRIVER);
		}catch(ClassNotFoundException e){
			e.printStackTrace();	
		}
        try{
        	//获取数据库连接
			conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
			//使用Connection来创建一个Statement对象
			Statement stmt=conn.createStatement();
			{
				//执行SQL语句，返回boolean值表示是否包含ResultSet
				boolean hasResultSet=stmt.execute(sql);
				//如果执行后有ResultSet结果集
				if(hasResultSet)
				{
					try{
						//获取结果
						ResultSet rs =stmt.getResultSet();
						//ResultSetMetaData用于分析结果集的元数据接口
						ResultSetMetaData rsmd =rs.getMetaData();
						int columnCount=rsmd.getColumnCount();
						//迭代输出ResultSet对象
						while (rs.next())
						{
							for (int i=0;i<columnCount;i++)
							{
								//一次输出每列的值
								System.out.println(rs.getString(i+1)+"\t");
							}
							System.out.println("\n");
						}
					}catch(SQLException e){
						e.printStackTrace();	
					}
				}
			}
			//
		}catch(SQLException e){
			e.printStackTrace();	
		}
    	try{
    		conn.close();
    	}catch(SQLException e){
    		e.printStackTrace();	
    	}
    	return false;
	}

	/**
	 * 可以执SQL语句中的DDL，DML语句
	 * 主要是insert，delete，update，create，drop
	 * 用ODBC中的executeUpdate()和Statement()
	 * @author liulian
	*/
	public int insertdeleteupdatecreatedropData(String sql) throws Exception {
		//加载驱动
		Class.forName(DBDRIVER);
		try{
			//连接数据库
			java.sql.Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
			//使用Connection创建一条Statement语句
			Statement stmt=conn.createStatement();
			//执行DML语句，返回受影响的记录条数
			 return stmt.executeUpdate(sql);
		}catch(Exception e){
			e.printStackTrace();	
		}
		return 0;
	}

	/**
	 * 可以执行任何SQL语句中inquire查询语句
	 * 使用ODBC中的executeQuery()和Statement
	 * @author liulian
	*/
	public boolean inquireData(String sql) throws Exception {
		//加载数据库
		Class.forName(DBDRIVER);
		try{
			//连接数据库
			java.sql.Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
			//使用Connection创建一条Statement语句
			Statement stmt=conn.createStatement();	
			//执行DML语句，返回受影响的记录条数
			ResultSet rs =stmt.executeQuery(sql);
			if(rs.next())
			{
				//查询成功，返回true
				return true;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		//查询失败
		return false;
	}

	/**
	 * @param args
	 */
		// TODO Auto-generated method stub
	public static void main(String[] args) throws Exception {
		JdbcExecutor es = new JdbcExecutor();
		es.initmessageconfig();
		System.out.println("删表：myodbc_test13");
		es.insertdeleteupdatecreatedropData("drop table myodbc_test13");
		System.out.println("建表：myodbc_test13");
		String put1 = es.readFileByChars(filename);
		es.insertdeleteupdatecreatedropData(put1);
		System.out.println("success");
	}
}
